package com.yy.controller;

import com.yy.pojo.User;
import com.yy.pojo.File;
import com.yy.service.FileService;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.transform.Result;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Controller
@RestController
@RequestMapping("/file")
public class FileController {

    @Autowired
    private FileService fileService;

    /**
     * 设置固定的日期格式
     */
    SimpleDateFormat sdf =new SimpleDateFormat("/yyyy/MM/dd/");

    @GetMapping("/getFileList")
    public List<File> getFileList(){
        List<File> fileList = fileService.getFileList();
        for (File file : fileList){
            System.out.println(file);
        }
        return fileList;
    }

    @GetMapping("/showAll/{userId}")
    public List<File> getFilesByUserId(@PathVariable("userId") String userId){
        List<File> filesByUserId = fileService.getFilesByUserId(userId);
        for (File file : filesByUserId){
            System.out.println(file);
        }
        return filesByUserId;
    }

//    @DeleteMapping("/deleteDpt/{dptId}")
//    public int deleteDpt(@PathVariable("dptId") String dptId){
//        return dptService.deleteDpt(dptId);
//    }
//
    /**
     * 登录情况下的showAll
     */
    @GetMapping("/showAll")
    public String findAll(HttpSession session, Model model){
        //在登入的session中获取Id
        User user = (User) session.getAttribute("user");
        List<File> files = fileService.getFilesByUserId(user.getUid());
        model.addAttribute("files",files);
        return "showAll";
    }

//-------------------------------------------------------------------
    /**
     * 上传文件的处理 并保持文件信息保存到数据库
     */
//
//    private  final static String rootPath = "D:/文件/";
//    @RequestMapping("/upload")
//    public Object uploadFile(MultipartFile[] multipartFiles){
//        File fileDir = new File(rootPath);
//        if (!fileDir.exists() && !fileDir.isDirectory()) {
//            fileDir.mkdirs();
//        }
//        try {
//            if (multipartFiles != null && multipartFiles.length > 0) {
//                for(int i = 0;i<multipartFiles.length;i++){
//                    try {
//                        //以原来的名称命名,覆盖掉旧的，这里也可以使用UUID之类的方式命名，这里就没有处理了
//                        String storagePath = rootPath+multipartFiles[i].getOriginalFilename();
//                        System.out.println("上传的文件：" + multipartFiles[i].getName() + "," + multipartFiles[i].getContentType() + "," + multipartFiles[i].getOriginalFilename()
//                                +"，保存的路径为：" + storagePath);
//                        // 3种方法： 第1种
////                        Streams.copy(multipartFiles[i].getInputStream(), new FileOutputStream(storagePath), true);
//                        // 第2种
////                        Path path = Paths.get(storagePath);
////                        Files.write(path,multipartFiles[i].getBytes());
//                        // 第3种
//                        multipartFiles[i].transferTo(new File(storagePath));
//                    } catch (IOException e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        //前端可以通过状态码，判断文件是否上传成功
//        return ResultUtil.result(EnumCode.OK.getValue(),"文件上传成功");
//    }

    @PostMapping("/upload")
    public String upload(MultipartFile aaa, HttpSession session, RedirectAttributes attributes) throws IOException {

        if (aaa.getContentType().equals("application/octet-stream")){
            System.out.println(1);
            attributes.addFlashAttribute("errorMessage","不能上传空文件！");
        }else {
            //获取当前登入的对象
            User user = (User) session.getAttribute("user");

            //获取文件的原始名称
            String oldFileName = aaa.getOriginalFilename();

            //获取文件的后缀
            String extension = "." + FilenameUtils.getExtension(aaa.getOriginalFilename());

            //生成新的文件名称
            String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-","").substring(6) + extension;

            //获取文件大小
            long size = aaa.getSize();

            //文件类型
            String type = aaa.getContentType();

            //处理根据日期生成目录
            String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static/files";
            String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            String dateDirPath = realPath + "/" + format;
            java.io.File dataDir = new java.io.File(dateDirPath);
            if (!dataDir.exists()){
                dataDir.mkdirs();
            }

            //处理文件上传
            aaa.transferTo(new java.io.File(dataDir,newFileName));


            File file=new File();
            file.setOldFileName(oldFileName);
            file.setNewFileName(newFileName);
            file.setExt(extension);
            file.setFileSize(String.valueOf(size));
            file.setFileType(type);
            file.setFilePath("/files/"+format);
            file.setUserId(user.getUid());

            //将文件存入数据库
            fileService.SaveFile(file);
        }
        return "upload ok";
    }

    /**
     * 文件下载
     */
    @GetMapping("/download")
    public void download(String uid,String openStyle,HttpServletResponse response) throws IOException {
        //获取文件信息
        File file = fileService.getFilesById(uid);
        //判断用户是在线打开还是下载
        openStyle = openStyle == null ? "attachment" : openStyle;
        if ("attachment".equals(openStyle)){
            //更新文件下载次数
            file.setDownCounts(file.getDownCounts()+1);
            fileService.update(file);
        }
        //根据文件信息中文件的名字和文件存储的路径获取文件输入流
        String realpath = ResourceUtils.getURL("classpath:").getPath() + "/static" + file.getFilePath();
        //获取文件输入流
        FileInputStream is = new FileInputStream(new java.io.File(realpath, file.getNewFileName()));
        //附件下载
        response.setHeader("content-disposition",openStyle+";fileName="+ URLEncoder.encode(file.getOldFileName(),"UTF-8"));
        //获取响应输出流
        ServletOutputStream os = response.getOutputStream();
        //文件拷贝
        IOUtils.copy(is,os);
        IOUtils.closeQuietly(is);
        IOUtils.closeQuietly(os);
    }

    //删除文件信息
    @GetMapping("/delete")
    public String delete(String uid) throws FileNotFoundException {
        //根据Id查询信息
        File file = fileService.getFilesById(uid);

        //删除文件
        String realpath = ResourceUtils.getURL("classpath:").getPath() + "/static" + file.getFilePath();
        java.io.File file1 = new java.io.File(realpath, file.getNewFileName());
        if (file1.exists()){
            file1.delete();//立即删除
        }

        //删除数据库中的纪律
        fileService.delete(uid);
        return "delete ok";
    }
    //-------------------------------------


//
//    // 将 yml 中的自定义配置注入到这里
//    @Value("${gorit.file.root.path}")
//    private String filePath;
//    // 日志打印
//    private Logger log = LoggerFactory.getLogger("FileController");
//
//    // 文件上传 （可以多文件上传）
//    @PostMapping("/upload")
//    public Result fileUploads(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException {
//        // 得到格式化后的日期
//        String format = sdf.format(new Date());
//        // 获取上传的文件名称
//        String fileName = file.getOriginalFilename();
//        // 时间 和 日期拼接
//        String newFileName = format + "_" + fileName;
//        // 得到文件保存的位置以及新文件名
//        File dest = new File(filePath + newFileName);
//        try {
//            // 上传的文件被保存了
//            file.transferTo(dest);
//            // 打印日志
//            log.info("上传成功，当前上传的文件保存在 {}",filePath + newFileName);
//            // 自定义返回的统一的 JSON 格式的数据，可以直接返回这个字符串也是可以的。
//            return Result.succ("上传成功");
//        } catch (IOException e) {
//            log.error(e.toString());
//        }
//        // 待完成 —— 文件类型校验工作
//        return Result.fail("上传错误");
//    }



}

